package com.tida.servir.pages;

import com.tida.servir.base.GeneralPage;
import com.tida.servir.components.Envelope;
import com.tida.servir.entities.*;
import com.tida.servir.services.GenericSelectModel;
import helpers.Helpers;
import helpers.Logger;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.Request;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 * Clase que maneja las unidades ejecutoras
 *
 * @author LFL
 */
public class AMEntidadUEjecutora extends GeneralPage {

    @Inject
    private Session session;
    @Inject
    private Request _request;
    @Component(id = "formulariomensajes")
    private Form formulariomensajes;
    @InjectComponent
    private Zone mensajesZone;
    @Component(id = "formDatos")
    private Form formDatos;
    @Component(id = "formOtrosDatos")
    private Form formOtrosDatos;
    @Component(id = "formUbicacion")
    private Form formUbicacion;
    @Property
    @SessionState
    private Usuario _usuario;
    @Property
    @Persist
    private Ubigeo ubigeoEntidadUE;
    @Property
    @Persist
    private boolean bsector;
    @Property
    @Persist
    private boolean btipoorganismo;
    @Property
    @Persist
    private boolean mostrar;
    @Persist
    @Property
    private String entidad_origen;
    //Trabajador
    @Persist
    @Property
    private String nombreTrabajador;
    @Persist
    @Property
    private String titular;
    @Persist
    @Property
    private String jefeOGA;
    @Persist
    @Property
    private String jefeRRHH;
    @Property
    @Persist
    private boolean btitular;
    @Property
    @Persist
    private boolean bjefeOGA;
    @Property
    @Persist
    private boolean bjefeRRHH;
    @Property
    @Persist
    private boolean btitulari;
    @Property
    @Persist
    private boolean bjefeOGAi;
    @Property
    @Persist
    private boolean bjefeRRHHi;
    //Busqueda Entidad Zone
    @InjectComponent
    @Property
    private Zone busquedacombosZone;
    @Component(id = "formBusqueda")
    private Form formBusqueda;
    @Property
    @Persist
    private DatoAuxiliar bnivelGobierno;
    @Property
    @Persist
    private DatoAuxiliar borganizacionEstado;
    @Property
    @Persist
    private DatoAuxiliar bsectorGobierno;
    @Property
    @Persist
    private DatoAuxiliar tipOrganismo;
    @Property
    @Persist
    private Ubigeo ubigeobusEntidadUE;
    @Persist
    @Property
    private String busdenominacion;
    @Persist
    @Property
    private String busestado;
    @Property
    @Persist
    private DatoAuxiliar btiposubentidad;
    @Property
    @Persist
    private Ubigeo ubigeobusSubEntidadUE;
    @Persist
    @Property
    private String bussubdenominacion;
    @Persist
    @Property
    private String bussubestado;
    @Inject
    private PropertyAccess _access;
    @Persist
    @Property
    private boolean mostrarFiltros;
    @Persist
    @Property
    private String mostrarEsconder;
    @InjectComponent
    private Envelope envelope;
    // OBJETOS USADOS EN LA CLASE
    @InjectComponent
    private Zone listaentidadZone;
    @InjectComponent
    @Property
    private Zone autoridadZone;
    @Persist
    @Property
    private LkBusquedaEntidad listaentidad;
    @InjectComponent
    @Property
    private Zone zoneDatos;
    @InjectComponent
    @Property
    private Zone ubigeoEntidadZone;
    @InjectComponent
    @Property
    private Zone zoneOtrosDatos;
    @InjectComponent
    @Property
    private Zone botonesZone;
    @InjectComponent
    @Property
    private Zone zoneBusUbigeo;
    
    private Form formulariobotones;
    
    @Inject
    private Request request;
    @Property
    @Persist
    private Entidad entidadUE;
    @Property
    @Persist
    private boolean bMuestraSector;
    @Property
    @Persist
    private boolean bMuestraSectorEdicion;
    @Property
    @Persist
    private boolean bSeleccionaPersonal;
    @Property
    @Persist
    private boolean bSeleccionaEntidad;
    @Property
    @Persist
    private boolean bessubentidad;
    @Property
    @Persist
    private boolean noCambiaSubentidad;
    @Property
    @Persist
    private boolean bCancelFormulario;
    @Property
    @Persist
    private boolean bBuscaEntidad;
    @Property
    @Persist
    private boolean bResetFormulario;
    @Persist
    @Property
    private Entidad rowEntidad;
    @Persist
    @Property
    private String jefeResponsable;
    @Property
    @Persist
    private UsuarioAcceso usua;
    @Inject
    private ComponentResources _resources;
    //validaciones
    @Persist
    @Property
    private Boolean vformulario;
    @Persist
    @Property
    private Boolean vval_essub;
    @Persist
    @Property
    private Boolean vbotones;
    @Persist
    @Property
    private Boolean veliminar;
    @Persist
    @Property
    private Boolean veditar;
    @Persist
    @Property
    private Boolean vdetalle;
    @Persist
    @Property
    private Boolean arroja;
    @Persist
    @Property
    private Boolean editando;
    @PageActivationContext
    private Entidad entidadalerta;
    @Property
    @Persist
    private Boolean opcion_limpiar;
    @Persist
    @Property
    private boolean vbatch;
    @Property
    @Persist
    private Funcionario funcionario;
    @Property
    @Persist
    private Integer tipoFuncionarioSeleccionado;
    
    @InjectComponent
    @Property
    private Zone zoneBusOrganizacion;
    @InjectComponent
    @Property
    private Zone zoneBusSector;
       
    @Log
    public Entidad getEntidadalerta() {
        return entidadalerta;
    }

    public void setEntidadalerta(Entidad entidadalerta) {
        this.entidadalerta = entidadalerta;
    }
    // loguear operación de entrada a pagina

    @Log
    @CommitAfter
    Object logueo() {
        new Logger().loguearOperacion(session, _usuario, "", Logger.CODIGO_OPERACION_SELECT, Logger.RESULTADO_OPERACION_OK, Logger.TIPO_OBJETO_ENTIDAD);
        if (entidadalerta != null) {
            String hql = "update RNSDD_EVENTO set estadoevento=1 where tipoevento_id='" + Logger.MODIFICACION_ENTIDADES + "' and tabla_id='" + entidadalerta.getId() + "' and estadoevento=0";
            System.out.println("iniciooooo" + Logger.MODIFICACION_ENTIDADES + "-" + entidadalerta.getId());
            Query query = session.createSQLQuery(hql);
            int rowCount = query.executeUpdate();
        }
        return null;
    }

    // incio de la pagina
    @Log
    void setupRender() {
        vbatch = false;
        logueo();
        formulariomensajes.clearErrors();
        entidadUE = new Entidad();
        ubigeoEntidadUE = new Ubigeo();
        titular = null;
        jefeRRHH = null;
        jefeOGA = null;
        jefeResponsable = null;
        //accesos
        vbotones = false;
        vformulario = false;
        vdetalle = false;
        editando = false;
        opcion_limpiar = false;
        if (entidadalerta != null) {
            entidadUE = entidadalerta;
            ruc_anterior = entidadUE.getRuc();
            editando = true;
            opcion_limpiar = true;
            seteo();
            entidadalerta = null;
        }

        Query query = session.getNamedQuery("callSpUsuarioAccesoPagina");
        query.setParameter("in_login", _usuario.getLogin());
        query.setParameter("in_pagename", _resources.getPageName().toUpperCase());
        List result = query.list();
        if (result.isEmpty()) {
            System.out.println(String.valueOf("Vacio:"));
            arroja = true;
        } else {
            usua = (UsuarioAcceso) result.get(0);
            if (usua.getAccesoupdate() == 1) {
                veditar = true;
                vbotones = true;
            }
            if (usua.getAccesodelete() == 1) {
                veliminar = true;
            }
            if (usua.getAccesoreport() == 1) {
                vformulario = true;
                vbotones = true;
            }
        }
    }

    // carga nueva entidad
    @Log
    void nuevoRegistro() {
        formulariomensajes.clearErrors();
        entidadUE = new Entidad();
        entidad_origen = "";
        titular = "";
        jefeRRHH = "";
        jefeOGA = "";
        jefeResponsable = "";
        bessubentidad = false;
        vbatch = false;
        ubigeoEntidadUE = new Ubigeo();
        //
        noCambiaSubentidad = false;
        tipoFuncionarioSeleccionado = -1;
        ruc_anterior = "";
    }

    // cargar datos
    @Log
    void seteo() {
        titular = null;
        jefeRRHH = null;
        jefeOGA = null;
        jefeResponsable = null;
        if (entidadUE.getOrganizacionEstado() != null) {
            if (entidadUE.getOrganizacionEstado().getCodigo() == 5) {
                bMuestraSectorEdicion = true;
            } else {
                bMuestraSectorEdicion = false;
            }
        } else {
            bMuestraSectorEdicion = false;
        }
        if (entidadUE.getDepartamento() != null) {
            ubigeoEntidadUE.setDepartamento(entidadUE.getDepartamento());
        }
        if (entidadUE.getProvincia() != null) {
            ubigeoEntidadUE.setProvincia(entidadUE.getProvincia());
        }
        if (entidadUE.getDistrito() != null) {
            ubigeoEntidadUE.setDistrito(entidadUE.getDistrito());
        }
    }

    // cargar combos
    @Log
    //para obtener datatos del Nivel Gobierno
    public GenericSelectModel<DatoAuxiliar> getNivelGobierno() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("NIVELGOBIERNO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos del Sector Gobierno
    public GenericSelectModel<DatoAuxiliar> getSectorGobierno() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("SECTORGOBIERNO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos de la Organizacion
    public GenericSelectModel<DatoAuxiliar> getOrganizacionEstado() {
        List<DatoAuxiliar> list = new ArrayList<DatoAuxiliar>();
        if (bnivelGobierno != null) {
            list = Helpers.getDatoAuxiliar("ORGANIZACIONESTADO", "NIVELGOBIERNO", bnivelGobierno.getCodigo(), session);
        }
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos de la Organizacion
    public GenericSelectModel<DatoAuxiliar> getOrganizacionEstadoEdicion() {
        List<DatoAuxiliar> list = new ArrayList<DatoAuxiliar>();
        if (entidadUE.getNivelGobierno() != null) {
            list = Helpers.getDatoAuxiliar("ORGANIZACIONESTADO", "NIVELGOBIERNO", entidadUE.getNivelGobierno().getCodigo(), session);
        }
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos del Tipo Organismo
    public GenericSelectModel<DatoAuxiliar> getTipoOrganismo() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOORGANISMO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos del Tipo Via
    public GenericSelectModel<DatoAuxiliar> getTipoVia() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOVIA", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos del Tipo Zona
    public GenericSelectModel<DatoAuxiliar> getTipoZona() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOZONA", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos del Tipo Via Sub Entidad
    public GenericSelectModel<DatoAuxiliar> getSubTipoVia() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOVIA", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos del Tipo Zona Sub Entidad
    public GenericSelectModel<DatoAuxiliar> getSubTipoZona() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOZONA", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos del Tipo Entidad
    public GenericSelectModel<DatoAuxiliar> getTipoSubEntidad() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOSUBENTIDAD", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    // seleccion de boton
    @Log
    void onSelectedFromBusreset() {
        bnivelGobierno = null;
        bsectorGobierno = null;
        borganizacionEstado = null;
        tipOrganismo = null;
        busdenominacion = "";
        ubigeobusEntidadUE = new Ubigeo();
        btiposubentidad = null;
        bussubdenominacion = "";
        ubigeobusSubEntidadUE = new Ubigeo();
        bBuscaEntidad = false;
        busestado = null;
        bMuestraSector = false;
        vbatch = false;
    }

    @Log
    void onSelectedFromBusenviar() {
        bBuscaEntidad = true;
    }

    // formulario de busqueda
    @Log
    @CommitAfter
    Object onSuccessFromformBusqueda() {
        if (!bBuscaEntidad) {
            return this;//new MultiZoneUpdate("busquedacombosZone", busquedacombosZone.getBody());
        } else {
            return listaentidadZone.getBody();
        }
    }

    @Log
    void resetFormulario(Entidad entidad) {
        formulariomensajes.clearErrors();
        entidadUE = (Entidad) session.load(Entidad.class, entidad.getId());
        if (entidadUE.getOrganizacionEstado() != null) {
            if (entidadUE.getOrganizacionEstado().getCodigo() == 5) {
                bMuestraSectorEdicion = true;
            } else {
                bMuestraSectorEdicion = false;
            }
        } else {
            bMuestraSectorEdicion = false;
        }
        if (entidadUE.getDepartamento() != null) {
            ubigeoEntidadUE.setDepartamento(entidadUE.getDepartamento());
        }
        if (entidadUE.getProvincia() != null) {
            ubigeoEntidadUE.setProvincia(entidadUE.getProvincia());
        }
        if (entidadUE.getDistrito() != null) {
            ubigeoEntidadUE.setDistrito(entidadUE.getDistrito());
        }
        ubigeobusEntidadUE = new Ubigeo();
        vbatch = false;
    }

    // accion de boton
    @Log
    void onSelectedFromReset() {
        bResetFormulario = true;
        editando = false;
    }

    @Log
    void onSelectedFromCancel() {
        bCancelFormulario = true;
        editando = false;
    }

    @Log
    void onSelectedFromguardarentidad() {
        insertarentidad = true;
    }
    
    final static private String charset = "[a-zA-Z0-9_]"; // separate this out for future fixes
    final static private String regex = charset + "+@" + charset + "+." + charset + "+";
    final static private String regexp = charset + "+@" + charset + "+." + charset + "+." + charset + "+";

    boolean validEmail(String email) {
        if(!email.matches(regex)){
            if(email.matches(regexp)){
                return true;
            }else{
                return false;
            }
        }else{
            return true;
        }
    }

    // fromulario principal
    @Log
    @CommitAfter
    Object onSuccessFromFormulariobotones() {
        try {
            formulariomensajes.clearErrors();
            if (insertarentidad) {
                if (ubigeoEntidadUE.getDepartamento() != null) {
                    entidadUE.setDepartamento(ubigeoEntidadUE.getDepartamento());
                }
                if (ubigeoEntidadUE.getProvincia() != null) {
                    entidadUE.setProvincia(ubigeoEntidadUE.getProvincia());
                }
                if (ubigeoEntidadUE.getDistrito() != null) {
                    entidadUE.setDistrito(ubigeoEntidadUE.getDistrito());
                }

                Criteria c = session.createCriteria(Entidad.class);
                if (!editando) {
                    entidadUE.setEstado(true);
                    c.add(Restrictions.eq("ruc", entidadUE.getRuc()));
                    if (!c.list().isEmpty()) {
                        envelope.setContents("RUC duplicado");
                        return actualizarZonas();
                    }
                } else // modificacion
                {
                    c.add(Restrictions.ne("ruc", ruc_anterior));
                    c.add(Restrictions.eq("ruc", entidadUE.getRuc()));
                    if (!c.list().isEmpty()) {
                        envelope.setContents("RUC duplicado");
                        return actualizarZonas();
                    }
                }

                if (entidadUE.getNivelGobierno() == null) {
                    envelope.setContents("Debe ingresar el Nivel de Gobierno");
                    return actualizarZonas();
                }

                if (entidadUE.getOrganizacionEstado() == null) {
                    envelope.setContents("Debe ingresar la Organizacion Estado");
                    return actualizarZonas();
                }

                if (entidadUE.getOrganizacionEstado().getCodigo() == 5) {
                    if (entidadUE.getSectorGobierno() == null) {
                        envelope.setContents("Debe ingresar el Sector");
                        return actualizarZonas();
                    }
                    if (entidadUE.getTipoOrganismo() == null) {
                        envelope.setContents("Debe ingresar el Tipo de Organismo");
                        return actualizarZonas();
                    }
                }
                if (entidadUE.getCorreoJefeTransparencia() != null) {
                    if (!validEmail(entidadUE.getCorreoJefeTransparencia())) {
                        System.out.println("CORREO : "+entidadUE.getCorreoJefeTransparencia());
                        envelope.setContents("Ingrese un email válido para el Jefe de Transparencia.");
                        return actualizarZonas();
                    }
                }

                if (entidadUE.getDenominacion() == null) {
                    envelope.setContents("Debe ingresar el nombre de la Entidad ");
                    return actualizarZonas();
                }
                if (usua.getAccesoreport() == 0 && usua.getAccesoupdate() == 1) {
                    vformulario = false;
                }
                // VERIFICACION QUE ES UNA CREACION
                System.out.println("CODXZ  " + entidadUE.getId() + "    " + entidadUE.getCue_entidad());
                boolean crearCodigoServir = false;
                if (entidadUE.getCue_entidad() == null || entidadUE.getCue_entidad().length() == 0) {
                    crearCodigoServir = true;
                }

                session.saveOrUpdate(entidadUE);

                // GENERACION DEL CODIGO SERVIR           
                if (crearCodigoServir == true) {
                    NumberFormat formatter = new DecimalFormat("0000");
                    String nuevoCUE;

                    if (String.valueOf(entidadUE.getId()).length() < 4) {
                        nuevoCUE = formatter.format(entidadUE.getId());
                    } else {
                        nuevoCUE = String.valueOf(entidadUE.getId()).substring(String.valueOf(entidadUE.getId()).length() - 4);
                    }
                    String codSERVIR = "RNSDD" + nuevoCUE;
                    System.out.println(codSERVIR);
                    entidadUE.setCue_entidad(codSERVIR);
                    session.saveOrUpdate(entidadUE);
                }
                session.flush();
                new Logger().loguearOperacion(session, _usuario, String.valueOf(entidadUE.getId()), (editando ? Logger.CODIGO_OPERACION_UPDATE : Logger.CODIGO_OPERACION_INSERT), Logger.RESULTADO_OPERACION_OK, Logger.TIPO_OBJETO_ENTIDAD);
                insertarentidad = false;

                if (editando) {
                    if (usua.getAccesoreport() == 0) {
                        vformulario = false;
                    }
                    new Logger().loguearEvento(session, Logger.MODIFICACION_ENTIDADES, entidadUE.getId(), _usuario.getId(), _usuario.getId(), Logger.MOTIVO_MODIFICACION_ENTIDADES, entidadUE.getId());
                } else {
                    new Logger().loguearEvento(session, Logger.MODIFICACION_ENTIDADES, entidadUE.getId(), _usuario.getId(), _usuario.getId(), Logger.MOTIVO_REGISTRO_ENTIDADES, entidadUE.getId());
                }
                editando = false;
                envelope.setContents(this.mensaje_accion());
                // OPCION DE LIMPIAR CAMPOS (OPCIONAL)
                opcion_limpiar = false;

            } else if (bResetFormulario) {
                if (opcion_limpiar.equals(true)) {
                    //resetFormulario(entidadUE);
                    this.limpiar_formulario();
                } else {// entidadUE = new Entidad();
                    this.limpiar_formulario();
                }
                opcion_limpiar = false;
                editando = false;
                bResetFormulario = false;
                funcionario = new Funcionario();
                return new MultiZoneUpdate("zoneDatos", zoneDatos.getBody()).
                        add("ubigeoEntidadZone", ubigeoEntidadZone.getBody()).
                        add("zoneOtrosDatos", zoneOtrosDatos.getBody()).
                        add("botonesZone", botonesZone.getBody()).
                        add("autoridadZone", autoridadZone.getBody());
            } else if (bCancelFormulario) {
                bCancelFormulario = false;
                editando = false;
                nuevoRegistro();
                if (!vbotones) {
                    vformulario = false;
                } else {
                    return new MultiZoneUpdate("zoneDatos", zoneDatos.getBody()).
                            add("ubigeoEntidadZone", ubigeoEntidadZone.getBody()).
                            add("zoneOtrosDatos", zoneOtrosDatos.getBody()).add("botonesZone", botonesZone.getBody()).add("autoridadZone", autoridadZone.getBody());
                }
            }

            nuevoRegistro();
            return new MultiZoneUpdate("zoneDatos", zoneDatos.getBody()).
                    add("ubigeoEntidadZone", ubigeoEntidadZone.getBody()).
                    add("mensajesZone", mensajesZone.getBody()).
                    add("botonesZone", botonesZone.getBody()).
                    add("zoneOtrosDatos", zoneOtrosDatos.getBody()).
                    add("autoridadZone", autoridadZone.getBody()).
                    add("listaentidadZone", listaentidadZone.getBody());
        } catch (NullPointerException e) {
            return this;
        }
    }

    @Log
    @CommitAfter
    Object onSuccessFromFormDatos() {
        return zoneDatos.getBody();
    }

    @Log
    public Object actualizarZonas() {
        return new MultiZoneUpdate("zoneDatos", zoneDatos.getBody()).
                add("ubigeoEntidadZone", ubigeoEntidadZone.getBody()).
                add("mensajesZone", mensajesZone.getBody());
    }

    @Log
    public void onActivate(Entidad eue) {
        entidadUE = eue;
        mostrarEsconder = "Ocultar";
        mostrarFiltros = true;
    }
    @Persist
    private String ruc_anterior;

    //accion de editar entidad
    @Log
    Object onEditarSeleccion(Entidad entidad) {
        entidadUE = entidad;
        seteo();//renato agregado
        editando = true;
        if (entidad.getRuc() != null) {
            ruc_anterior = entidad.getRuc();
        }
        vformulario = true;
        vbotones = true;
        opcion_limpiar = true;
        formulariomensajes.clearErrors();
        tipoFuncionarioSeleccionado = null;
        return new MultiZoneUpdate("zoneDatos", zoneDatos.getBody()).
                add("ubigeoEntidadZone", ubigeoEntidadZone.getBody()).
                add("zoneOtrosDatos", zoneOtrosDatos.getBody()).
                add("botonesZone", botonesZone.getBody()).
                add("autoridadZone", autoridadZone.getBody());
    }

    // ver detalle de entidad
    @Log
    Object onActionFromDetalle(Entidad entidad) {
        entidadUE = entidad;
        seteo();
        vdetalle = true;
        vbotones = false;
        vformulario = true;
        bessubentidad = true;
        //
        noCambiaSubentidad = true;
        //
        return new MultiZoneUpdate("zoneDatos", zoneDatos.getBody()).
                add("ubigeoEntidadZone", ubigeoEntidadZone.getBody()).
                add("zoneOtrosDatos", zoneOtrosDatos.getBody()).
                add("autoridadZone", autoridadZone.getBody()).
                add("botonesZone", botonesZone.getBody()).
                add("mensajesZone", mensajesZone.getBody());
    }

    // eliminar entidad
    @Log
    @CommitAfter
    Object onActionFromEliminarSeleccion(Entidad enti1) {
        Criteria c = session.createCriteria(Usuario.class);
        c.add(Restrictions.eq("entidad", enti1));
        c.add(Restrictions.eq("estado", 1L));
        if (c.list().isEmpty()) {
            if (enti1.getEstado()) {
                enti1.setEstado(false);
                new Logger().loguearOperacion(session, _usuario, String.valueOf(enti1.getId()), Logger.CODIGO_OPERACION_DELETE, Logger.RESULTADO_OPERACION_OK, Logger.TIPO_OBJETO_ENTIDAD);
                session.saveOrUpdate(enti1);
                envelope.setContents("Entidad Eliminada");
            } else {
                enti1.setEstado(true);
                session.saveOrUpdate(enti1);
                envelope.setContents("Entidad Revertida");
            }
        } else {
            envelope.setContents("Entidad no puede ser eliminada, tiene usuarios activos.");
        }
        return new MultiZoneUpdate("mensajesZone", mensajesZone.getBody()).add("listaentidadZone", listaentidadZone.getBody());
    }

    @Log
    public List<LkBusquedaEntidad> getListadoEntidades() {
        List<LkBusquedaEntidad> listaEntidad;
        Criteria c = session.createCriteria(LkBusquedaEntidad.class);
        if (bBuscaEntidad) {
            //Entidad
            if (bnivelGobierno != null) {
                c.add(Restrictions.eq("nivelgobierno", bnivelGobierno.getValor()));
            }
            if (bsectorGobierno != null) {
                c.add(Restrictions.eq("sectorgobierno", bsectorGobierno.getValor()));
            }
            if (borganizacionEstado != null) {
                c.add(Restrictions.eq("organizacionestado", borganizacionEstado.getValor()));
            }
            if (tipOrganismo != null) {
                c.add(Restrictions.eq("tipoorganismo", tipOrganismo.getValor()));
            }
            if (busdenominacion != null) {
                c.add(Restrictions.disjunction().add(Restrictions.like("denominacion", "%" + busdenominacion + "%").ignoreCase()).
                        add(Restrictions.like("denominacion", "%" + busdenominacion.replaceAll("ñ", "n") + "%").ignoreCase()).
                        add(Restrictions.like("denominacion", "%" + busdenominacion.replaceAll("n", "ñ") + "%").ignoreCase()).
                        add(Restrictions.like("descriptores", "%" + busdenominacion + "%").ignoreCase()).
                        add(Restrictions.like("descriptores", "%" + busdenominacion.replaceAll("ñ", "n") + "%").ignoreCase()).
                        add(Restrictions.like("descriptores", "%" + busdenominacion.replaceAll("n", "ñ") + "%").ignoreCase()).
                        add(Restrictions.like("SIGLA", "%" + busdenominacion + "%").ignoreCase()).
                        add(Restrictions.like("SIGLA", "%" + busdenominacion.replaceAll("ñ", "n") + "%").ignoreCase()).
                        add(Restrictions.like("SIGLA", "%" + busdenominacion.replaceAll("n", "ñ") + "%").ignoreCase()));
            }
            if (ubigeobusEntidadUE.getDepartamento() != null) {
                c.add(Restrictions.eq("departamento", ubigeobusEntidadUE.getDepartamento().getValor()));
            }
            if (ubigeobusEntidadUE.getProvincia() != null) {
                c.add(Restrictions.eq("provincia", ubigeobusEntidadUE.getProvincia().getValor()));
            }
            if (ubigeobusEntidadUE.getDistrito() != null) {
                c.add(Restrictions.eq("distrito", ubigeobusEntidadUE.getDistrito().getValor()));
            }
            if (busestado != null) {
                if (busestado.equalsIgnoreCase("Activo")) {
                    c.add(Restrictions.eq("estado", true));
                } else {
                    c.add(Restrictions.eq("estado", false));
                }
            }
        }
        listaEntidad = c.list();
        nroregistros = Integer.toString(listaEntidad.size());
        return listaEntidad;
    }
    @Persist
    @Property
    private String nroregistros;
    @Property
    @Persist
    private boolean insertarentidad;

//    @Log
//    public List<LkBusquedaTrabajador> getTrabajadores() {
//        Criteria c = session.createCriteria(LkBusquedaTrabajador.class);
//        c.add(Restrictions.eq("entidad_id", entidadUE.getId()));
//        if (nombreTrabajador != null) {
//            c.add(Restrictions.disjunction().add(Restrictions.like("nombretrabajador", "%" + nombreTrabajador + "%").ignoreCase()).add(Restrictions.like("nombretrabajador", "%" + nombreTrabajador.replaceAll("ñ", "n") + "%").ignoreCase()).add(Restrictions.like("nombretrabajador", "%" + nombreTrabajador.replaceAll("n", "ñ") + "%").ignoreCase()));
//        }
//        return c.list();
//    }
    @Log
    void onDenominacionChanged() {
        entidadUE.setDenominacion(_request.getParameter("param"));
    }

    @Log
    void onSiglaChanged() {
        entidadUE.setSigla(_request.getParameter("param"));
    }

    @Log
    void onRucChanged() {
        entidadUE.setRuc(_request.getParameter("param"));
    }

    @Log
    void onCue_EntidadChanged() {
        entidadUE.setCue_entidad(_request.getParameter("param"));
    }

    @Log
    void onCue_ruffChanged() {
        entidadUE.setCue_rufe(_request.getParameter("param"));
    }

    @Log
    void onDireccionChanged() {
        entidadUE.setDescvia(_request.getParameter("param"));
    }

    @Log
    void onDescZonaChanged() {
        entidadUE.setDescZona(_request.getParameter("param"));
    }

    @Log
    void onEmailInstitucionalChanged() {
        entidadUE.setEmailInstitucional(_request.getParameter("param"));
    }

    @Log
    void onUrlEntidadChanged() {
        entidadUE.setUrlEntidad(_request.getParameter("param"));
    }

    @Log
    void onTelefonoEntidadChanged() {
        entidadUE.setTelefonoEntidad(_request.getParameter("param"));
    }

    // evento de cambio en los campos
    @Log
    Object onValueChangedFrombnivelGobierno(DatoAuxiliar dato) {
        bMuestraSector = false;
        borganizacionEstado = null;
        bsectorGobierno = null;
        tipOrganismo = null;
        //return zoneBusOrganizacion.getBody();
        return new MultiZoneUpdate("zoneBusOrganizacion", zoneBusOrganizacion.getBody()).add("zoneBusSector", zoneBusSector.getBody());
    }

    @Log
    Object onValueChangedFromborganizacionEstado(DatoAuxiliar dato) {
        if (dato != null) {
            bsectorGobierno = null;
            tipOrganismo = null;
            if (dato.getCodigo() == 5) {
                bMuestraSector = true;
            } else {
                bMuestraSector = false;
            }
        }
        //return request.isXHR() ? new MultiZoneUpdate("busquedacombosZone", busquedacombosZone.getBody()) : null;
        return zoneBusSector.getBody();
    }

    @Log
    Object onValueChangedFromNivelGobierno(DatoAuxiliar dato) {
        bMuestraSectorEdicion = false;
        entidadUE.setOrganizacionEstado(null);
        entidadUE.setSectorGobierno(null);
        entidadUE.setTipoOrganismo(null);
        if (dato == null) {
            entidadUE.setOrganizacionEstado(null);
        }
        //return request.isXHR() ? new MultiZoneUpdate("zoneDatos", zoneDatos.getBody()) : null;
        return zoneDatos.getBody();
    }

    @Log
    Object onValueChangedFromOrganizacionEdicion(DatoAuxiliar dato) {
        if (dato != null) {
            entidadUE.setSectorGobierno(null);
        entidadUE.setTipoOrganismo(null);
            if (dato.getCodigo() == 5) {
                bMuestraSectorEdicion = true;
            } else {
                bMuestraSectorEdicion = false;
            }
        }
        //return request.isXHR() ? new MultiZoneUpdate("zoneDatos", zoneDatos.getBody()) : null;
        return zoneDatos.getBody();
    }

    @Log
    void onBussubdenominacionChanged() {
        bussubdenominacion = _request.getParameter("param");
    }

    @Log
    void onBusdenominacionChanged() {
        busdenominacion = _request.getParameter("param");
    }

    // limpiar formulario
    private void limpiar_formulario() {
        bCancelFormulario = true;
        editando = false;
        entidadUE = new Entidad();
        entidad_origen = null;
        titular = null;
        jefeRRHH = null;
        jefeOGA = null;
        jefeResponsable = null;
        bessubentidad = false;
        //
        noCambiaSubentidad = false;
        //
        ubigeoEntidadUE.setDepartamento(null);
        ubigeoEntidadUE.setProvincia(null);
        ubigeoEntidadUE.setDistrito(null);
        vbatch = false;
    }

    private String mensaje_accion() {
        String tipo = "";
        String modo = "";
        tipo = "Entidad";
        if (opcion_limpiar) {
            modo = "modificada";
        } else {
            modo = "creada";
        }
        return tipo + " " + modo + " Exitosamente";
    }

    void onDescriptoresChanged() {
        entidadUE.setDescriptores(_request.getParameter("param"));
    }

    void onMisionChanged() {
        entidadUE.setMision(_request.getParameter("param"));
    }

    void onLeyCreacionChanged() {
        entidadUE.setLeyCreacion(_request.getParameter("param"));
    }

    void onTitularChanged() {
        entidadUE.setTitular(_request.getParameter("param"));
    }

    void onJefeRRHHChanged() {
        entidadUE.setJefeRRHH(_request.getParameter("param"));
    }

    void onJefeogaChanged() {
        entidadUE.setJefeOga(_request.getParameter("param"));
    }

    void onJefetransparenciaChanged() {
        entidadUE.setJefeTransparencia(_request.getParameter("param"));
    }

    void onCargotitularChanged() {
        entidadUE.setCargoTitular(_request.getParameter("param"));
    }

    void onCargojefeRRHHChanged() {
        entidadUE.setCargoJefeRRHH(_request.getParameter("param"));
    }

    void onCargojefeogaChanged() {
        entidadUE.setCargoJefeOga(_request.getParameter("param"));
    }

    void onCargojefetransparenciaChanged() {
        entidadUE.setCargoJefeTransparencia(_request.getParameter("param"));
    }

    void oncorreojefetransparenciaChanged() {
        entidadUE.setCorreoJefeTransparencia(_request.getParameter("param"));
    }
}